Перейти к основному содержимому

5.01. Справочник по JavaScript

Разработчику Архитектору

Справочник по JavaScript

📚 Типы, операторы, выражения, инструкции

🔹 Типы данных

ТипОписаниеПроверка (typeof)Примечания
undefinedЗначение по умолчанию для неинициализированных переменных и отсутствующих свойств'undefined'Единственное значение этого типа
nullПреднамеренное отсутствие значения'object' (историческая ошибка)null instanceof Objectfalse
booleanЛогический тип: true, false'boolean'Приводится из любого значения через Boolean(x) или !!x
number64-битное число с плавающей точкой по IEEE 754'number'Включает NaN, +0, -0, Infinity, -Infinity
bigintЦелое число произвольной точности'bigint'Создаётся суффиксом n, напр.: 123n, BigInt("123")
stringПоследовательность UTF-16 кодовых единиц'string'Неизменяема, индексация — str[i]
symbolУникальный идентификатор'symbol'Symbol(description?), Symbol.for(key), Symbol.keyFor(sym)
objectКоллекция ключ-значение или экземпляр'object'Включает массивы, функции (typeof fn === 'function'), даты, регэкспы, и т.д.
functionВызываемый объект'function'Подтип объекта, имеет [[Call]] и [[Construct]] внутренние слоты

⚠️ typeof null === 'object' — ошибка спецификации с 1995 г., сохранена для совместимости.


🔹 Операторы (в порядке приоритета, сверху вниз)

ПриоритетОператорАссоциативностьОписание
21. [] ?.ЛевоДоступ к свойству, опциональная цепочка
20new (с аргументами), new.target, import.metaПравоСоздание экземпляра, метаинформация
19++ -- (постфиксные)ЛевоИнкремент/декремент после выражения
18++ -- (префиксные), + - (унарные), ! ~, typeof, void, deleteПравоУнарные операции
17**ПравоВозведение в степень
16* / %ЛевоАрифметика
15+ - (бинарные)ЛевоСложение/вычитание (конкатенация при строках)
14<< >> >>>ЛевоПобитовые сдвиги
13< <= > >=, in, instanceofЛевоСравнения и проверки принадлежности
12== != === !==ЛевоРавенство/неравенство (== — с приведением)
11&ЛевоПобитовое И
10^ЛевоПобитовое XOR
9|ЛевоПобитовое ИЛИ
8&&ЛевоЛогическое И (short-circuit)
7||ЛевоЛогическое ИЛИ (short-circuit)
6??ЛевоNullish coalescing (a ?? bb, если a null или undefined)
5? :ПравоТернарный условный оператор
4= += -= *= /= %= **= <<= >>= >>>= &= ^= |= &&= ||= ??=ПравоПрисваивания (включая логические и nullish compound)
3,ЛевоПоследовательное вычисление

✅ Примеры:

a ??= b;      // a = a ?? b
a &&= b; // a = a && b
a \|\|= b; // a = a \|\| b

🔹 Инструкции (statements)

ИнструкцияСинтаксисПримечания
var, let, constvar x; let y = 1; const z = 2;var — функциональная область видимости, let/const — блочная; const требует инициализацию
if / elseif (cond) stmt else stmtУсловие приводится к boolean
switchswitch (expr) { case val: …; break; default: … }Сравнение ===, fallthrough без break
forfor (init; cond; step) stmtinit может быть let/const
for…infor (prop in obj) stmtПеребирает перечислимые собственные и унаследованные строковые ключи
for…offor (value of iterable) stmtРаботает с итерируемыми (Array, String, Map, Set, генераторы и др.)
while, do…whilewhile (cond) stmt; do stmt while (cond)do…while гарантированно выполнится 1 раз
try…catch…finallytry { … } catch (e) { … } finally { … }catch может быть без параметра (ES2019+)
throwthrow expr;Выбрасывает исключение (обычно Error или наследник)
returnreturn; / return value;Только внутри функции (включая стрелочные и методы)
break, continuebreak [label]; / continue [label];Может использоваться с метками для выхода из вложенных циклов
withwith (obj) stmtЗапрещён в strict mode — не используйте
debuggerdebugger;Останавливает выполнение, если отладчик подключён
label:label: for …Метка для break/continue
function, class, import, exportДекларативные конструкцииПоднимаются (hoisting), но class и const/let — temporal dead zone

✅ Блочная область видимости:

{
let x = 1;
const y = 2;
}
// x, y недоступны вне блока

🔹 Выражения (expressions) — основные формы

КатегорияПримеры
Литералы42, "str", true, null, undefined, /regex/g, [], {}, function(){}, () => {}, class {}, 123n, Symbol()
Шаблонные строкиHello ${name}, text.raw, теггированные: Hello ${x}
Деструктуризацияconst {a, b: c = 10} = obj;, const [x, ...rest] = arr;
Распространение (spread)[...arr], {...obj}, fn(...args)
Остаток (rest)function f(a, ...rest), const [x, ...tail] = arr
ОператорыВсе перечисленные выше
Вызовыfn(), obj.method(), new C()
Стрелочные функцииx => x * 2, (a, b) => { return a + b }
Классыclass C { constructor() {…} method() {…} static s() {…} }
Async/awaitasync function f() { await p; }, const v = await expr;
Операторы yield, yield*Внутри генераторов: function* gen() { yield 1; }

📚 Стандартные встроенные объекты (built-in objects)


🔹 Object

Статические методы

МетодАргументыВозвращаетОписаниеОсобенности
Object.keys(obj)объектstring[]Перечислимые собственные строковые ключиНе включает символы, не включает унаследованные
Object.values(obj)объектany[]Значения по перечислимым собственным строковым ключамПорядок как в keys()
Object.entries(obj)объект[string, any][]Пары [ключ, значение]Порядок как в keys()
Object.fromEntries(iterable)итерируемое (например, entries())объектСоздаёт объект из парОбратная операция к entries()
Object.getOwnPropertyNames(obj)объектstring[]Все собственные строковые ключи (перечислимые + неперечислимые)Не включает символы
Object.getOwnPropertySymbols(obj)объектsymbol[]Все собственные символьные ключиВключает неперечислимые символы
Object.getOwnPropertyDescriptors(obj)объект{ [P in keyof obj]: PropertyDescriptor }Объект с дескрипторами всех собственных свойствАналог getOwnPropertyDescriptor для всех свойств
Object.getOwnPropertyDescriptor(obj, prop)объект, ключPropertyDescriptor | undefinedДескриптор свойстваДля несуществующего — undefined
Object.defineProperty(obj, prop, descriptor)объект, ключ, PropertyDescriptorобъектОпределяет или изменяет одно свойствоМожет сделать свойство неперечислимым, незаписываемым и т.д.
Object.defineProperties(obj, descriptors)объект, { [key]: PropertyDescriptor }объектМассовое определение свойств
Object.create(proto, [propertiesObject])прототип (null допустим), дескрипторыобъектСоздаёт объект с заданным [[Prototype]] и свойствамиObject.create(null) — полностью «чистый» объект
Object.getPrototypeOf(obj)объектобъект | null[[Prototype]] объектаАналог obj.__proto__ (устаревшее)
Object.setPrototypeOf(obj, proto)объект, прототипобъектУстанавливает [[Prototype]]Избегайте — медленно, нарушает оптимизации
Object.is(value1, value2)два значенияbooleanГлубокое равенство без приведенияObject.is(NaN, NaN) → true, Object.is(0, -0) → false
Object.hasOwn(obj, prop)объект, ключbooleanПроверяет, есть ли собственное свойство с именем propЗамена Object.prototype.hasOwnProperty.call(obj, prop)
Object.freeze(obj)объектобъектДелает объект незамораживаемым (no-extend, все свойства non-writable, non-configurable)Поверхностное действие
Object.seal(obj)объектобъектЗапрещает добавление/удаление свойств; делает их non-configurableЗапись разрешена, если writable: true
Object.preventExtensions(obj)объектобъектЗапрещает добавление новых свойствУдаление и изменение существующих — разрешено
Object.isFrozen(obj)объектbooleanПроверяет, заморожен ли объектВсе свойства non-writable & non-configurable, и [[Extensible]] === false
Object.isSealed(obj)объектbooleanПроверяет, запечатан ли объектВсе свойства non-configurable, и [[Extensible]] === false
Object.isExtensible(obj)объектbooleanПроверяет, можно ли расширять объектfalse после preventExtensions, seal, freeze

📌 PropertyDescriptor:

interface PropertyDescriptor {
configurable?: boolean; // можно ли удалять/менять дескриптор
enumerable?: boolean; // будет ли в for..in / keys()
writable?: boolean; // можно ли перезаписать значение (только для data-свойств)
value?: any; // значение (data-свойство)
get?(): any; // геттер (accessor-свойство)
set?(v: any): void; // сеттер (accessor-свойство)
}

⚠️ get/set и value/writable взаимоисключающи.


🔹 Function

Свойства экземпляра (все функции наследуют от Function.prototype)

Свойство / МетодТипОписание
lengthnumberКоличество формальных параметров (до первого параметра с дефолтом или rest)
namestringИмя функции (инферится: function f() {} → 'f', const f = () => {} → 'f', ({ f() {} }).f.name → 'f')
prototypeобъектСсылка на объект-прототип для конструкторов (new f() наследует от f.prototype)
call(thisArg, ...args)методВызывает функцию с заданным this и аргументами по отдельности
apply(thisArg, argsArray)методТо же, но аргументы — массивоподобный объект
bind(thisArg, ...args)методВозвращает новую функцию с привязанным this и частично применёнными аргументами (currying)
toString()методВозвращает исходный код функции как строку (гарантировано только для определённых случаев, напр. function f() {})

✅ Примеры:

function f(a, b = 0, ...rest) {}
f.length; // 1 — до первого параметра с дефолтом

const bound = f.bind(null, 1);
bound(2, 3, 4); // f(1, 2, 3, 4)

Конструктор Function

new Function('x', 'y', 'return x + y');
// эквивалентно: function(x, y) { return x + y; }

— создаёт функцию из строки кода; избегайте — нарушает scope, проблема безопасности.


🔹 Array

⚠️ Все методы ниже вызываются как arr.method(...).
📌 Многие методы принимают необязательный thisArg (2-й/3-й параметр), используемый как this внутри callback'а.

🔸 Мутабельные методы (изменяют исходный массив)

МетодАргументыВозвращаетПоведение
push(...items)элементыnumber — новая длинаДобавляет в конец
pop()элемент | undefinedУдаляет последний
unshift(...items)элементыnumber — новая длинаДобавляет в начало
shift()элемент | undefinedУдаляет первый
splice(start, deleteCount?, ...items)индекс, сколько удалить, вставитьany[] — удалённые элементыУдаляет и/или вставляет; start может быть отрицательным
reverse()thisИнвертирует порядок (in-place)
sort(compareFn?)(a, b) => numberthisСортирует лексикографически по умолчанию; мутирует; compareFn(a, b) < 0a до b
fill(value, start?, end?)значение, начало, конецthisЗаполняет диапазон значением
copyWithin(target, start, end?)куда, откуда, конецthisКопирует часть массива в другое место (in-place)

🔸 Немутабельные методы (возвращают новый массив / значение)

МетодАргументыВозвращаетПримечания
concat(...items)массивы / элементыany[]Объединяет; не мутирует
slice(start?, end?)начало, конецany[]Копия среза; end не включается
map(callback, thisArg?)(value, index, arr) => newValueany[]Трансформация
filter(callback, thisArg?)(value, index, arr) => booleanany[]Фильтрация
flatMap(callback, thisArg?)(value, index, arr) => any[]any[]map + flat(1)
flat(depth = 1)глубина (по умолчанию 1)any[]Уплощение; Infinity — полностью
reduce(callback, initialValue?)(acc, cur, idx, arr) => acc, начальноеanyСвёртка слева направо
reduceRight(...)то жеanyСвёртка справа налево
every(callback, thisArg?)(value, index, arr) => booleanbooleanВсе ли проходят условие
some(callback, thisArg?)(value, index, arr) => booleanbooleanЕсть ли хотя бы один
find(callback, thisArg?)(value, index, arr) => booleanэлемент | undefinedПервый, удовлетворяющий условию
findLast(callback, thisArg?)элемент | undefinedПоследний, удовлетворяющий условию (ES2023)
findIndex(callback, thisArg?)number (индекс) | -1Индекс первого подходящего
findLastIndex(callback, thisArg?)number | -1Индекс последнего подходящего (ES2023)
includes(value, fromIndex?)значение, с какого индексаbooleanПроверка наличия (NaN включён корректно)
indexOf(value, fromIndex?)значение, с какого индексаnumber | -1Первое вхождение; ===, NaN не ищется
lastIndexOf(value, fromIndex?)number | -1Последнее вхождение
at(index)индекс (может быть отрицательным)элемент | undefinedБезопасный доступ по индексу (ES2022)
toReversed()any[]Немутабельный reverse() (ES2023)
toSorted(compareFn?)any[]Немутабельный sort() (ES2023)
toSpliced(start, deleteCount, ...items)any[]Немутабельный splice() (ES2023)
with(index, value)индекс, новое значениеany[]Замена элемента без мутации (ES2023)

🔸 Итераторы и статические методы

МетодАргументыВозвращаетОписание
keys()итератор 0, 1, 2, …Индексы
values()итератор значенийТо же, что [Symbol.iterator]()
entries()итератор [i, value]Пары индекс-значение
Array.isArray(value)значениеbooleanПроверка, является ли value массивом
Array.from(arrayLike, mapFn?, thisArg?)массивоподобный, функция, thisany[]Преобразует в массив + опционально маппит
Array.of(...items)элементыany[]Создаёт массив из аргументов (new Array(3) ≠ Array.of(3))

Array.of(3)[3], new Array(3)[empty × 3]


🔹 String

Статические методы

МетодАргументыВозвращаетОписание
String.fromCharCode(...codes)коды (0–65535)строкаUTF-16 (не поддерживает суррогатные пары напрямую)
String.fromCodePoint(...codes)коды (до 0x10FFFF)строкаПоддерживает полный Unicode (ES2015)
String.raw(callSite, ...substitutions)вызов теггированной строкистрока«Сырая» интерполяция без экранирования (для шаблонов)

Методы экземпляра

МетодАргументыВозвращаетПримечания
lengthnumberКоличество кодовых единиц UTF-16 (не символов!)
charAt(index)индексstringПустая строка, если вне диапазона
charCodeAt(index)индексnumber (0–65535)Код UTF-16 единицы
codePointAt(index)индексnumber (0–0x10FFFF) | undefinedПолный Unicode code point (ES2015)
at(index)индекс (может быть отрицательным)string | undefinedБезопасный доступ (ES2022)
concat(...strings)строкиstringОбъединение (редко используется — лучше `a${b}`)
includes(search, fromIndex?)подстрока, началоbooleanПоиск подстроки
indexOf(search, fromIndex?)подстрока, началоnumber | -1Позиция первого вхождения
lastIndexOf(search, fromIndex?)number | -1Последнее вхождение
startsWith(search, position?)префикс, началоbooleanНачинается ли с…
endsWith(search, length?)суффикс, длина проверкиbooleanЗаканчивается ли на…
repeat(count)число ≥0stringПовторение строки
padStart(targetLength, padString?)длина, заполнительstringДополняет слева до длины
padEnd(targetLength, padString?)stringДополняет справа
trim()stringУдаляет пробелы с обоих концов
trimStart() / trimLeft()stringУдаляет слева
trimEnd() / trimRight()stringУдаляет справа
toLowerCase() / toUpperCase()stringРегистр (по локали, но без указания — «default»)
toLocaleLowerCase(locales?) / toLocaleUpperCase(locales?)локали (BIC код)stringЛокализованный регистр (например, турецкий I)
normalize(form = 'NFC')'NFC', 'NFD', 'NFKC', 'NFKD'stringUnicode нормализация
split(separator?, limit?)разделитель (строка | RegExp), лимитstring[]Разбиение
substring(indexStart, indexEnd?)начало, конецstringБез отрицательных индексов; автоматически сортирует аргументы
slice(start, end?)начало, конецstringПоддерживает отрицательные индексы; end не включается
substr(start, length?)начало, длинаstringУстаревший, избегайте — не везде одинаково реализован
match(regexp)RegExp | строкаRegExpMatchArray | nullПоиск по регэкспу (без флага g)
matchAll(regexp)RegExp (должен иметь флаг g)итератор RegExpMatchArrayВсе совпадения (ES2020)
search(regexp)RegExp | строкаnumber | -1Индекс первого совпадения
replace(search, replaceValue)подстрока | RegExp, строка | функцияstringЗамена первого совпадения (если search — строка)
replaceAll(search, replaceValue)то жеstringЗамена всех совпадений (ES2021)
replaceAll требует: если search — строка, replaceValue — строка; если RegExpне может иметь флаг g (ошибка)
localeCompare(compareString, locales?, options?)строка, локали, опцииnumber (-1,0,1)Локализованное сравнение
[Symbol.iterator]()итератор строковых символовПоддержка for..of по символам (не кодовым единицам!)

for (const ch of "🙂") → один символ (эмодзи), не два суррогата.


🔹 Number

Константы

КонстантаЗначение
Number.EPSILON2⁻⁵²2.220446049250313e-16 — машинное эпсилон для number
Number.MAX_VALUE1.7976931348623157e+308
Number.MIN_VALUE5e-324 — наименьшее положительное нормализованное
Number.MAX_SAFE_INTEGER2⁵³ - 1 = 9007199254740991
Number.MIN_SAFE_INTEGER-(2⁵³ - 1)
Number.POSITIVE_INFINITYInfinity
Number.NEGATIVE_INFINITY-Infinity
Number.NaNNaN

Статические методы

МетодОписание
Number.isFinite(value)true, если число и не ±Infinity, не NaN
Number.isInteger(value)true, если число и целое (в пределах safe integer)
Number.isSafeInteger(value)true, если целое и в диапазоне [MIN_SAFE_INTEGER, MAX_SAFE_INTEGER]
Number.isNaN(value)true, если valueNaN (без приведения!)
Number.parseFloat(string)Аналог глобального parseFloat
Number.parseInt(string, radix?)Аналог глобального parseInt

Методы экземпляра

МетодАргументыВозвращаетПримечания
toExponential(fractionDigits?)число цифр после точкистрокаНаучная запись: 1.23e+2
toFixed(fractionDigits = 0)число цифр после точкистрокаОкругление, не экспоненциальная форма
toPrecision(precision?)общее число значащих цифрстрокаАвтоматически выбирает формат
toLocaleString(locales?, options?)локали, опциистрокаФорматирование по локали (деньги, %, дата и т.п. — через Intl.NumberFormat)
valueOf()numberВозвращает примитив

🔹 Math

Все методы — статические.

МетодОписание
Math.abs(x)Модуль
Math.sign(x)-1, 0, -0, 1, NaN
Math.floor(x), Math.ceil(x), Math.round(x), Math.trunc(x)Округления
Math.fround(x)Приведение к 32-битному float
Math.min(...values), Math.max(...values)Мин/макс (возвращает -Infinity/Infinity, если аргументов нет)
Math.clamp(x, min, max)Не существует в ES2024 — часто эмулируется как Math.min(Math.max(x, min), max)
Math.random()[0, 1) — равномерное распределение
Math.seedrandomНе существует — нет встроенного способа засидить ГПСЧ
Math.sqrt(x), Math.cbrt(x)Квадратный, кубический корень
Math.hypot(...values)√(x² + y² + …) — избегает переполнения
Math.pow(base, exponent)base ** exponent — устаревший, используйте **
Math.exp(x), Math.expm1(x), eˣ - 1
Math.log(x), Math.log1p(x), Math.log2(x), Math.log10(x)Логарифмы
Math.sin(x), cos, tan, asin, acos, atan, atan2(y, x)Тригонометрия (в радианах)
Math.sinh(x), cosh, tanhГиперболические функции
Math.imul(a, b)32-битное целочисленное умножение (например, для хешей)
Math.fround(x)Приведение к float32
Math.clz32(x)Count Leading Zeros в 32-битном представлении
Math.signbit(x)Не существует

🔹 BigInt

Создание

const a = 123n;
const b = BigInt(123);
const c = BigInt("123456789012345678901234567890");

❗ Нельзя смешивать number и bigint в арифметике: 1n + 1TypeError.
✅ Допустимо: 1n + BigInt(1), Number(1n).

Операторы

Поддерживают: +, -, *, /, %, **, <<, >>, >>> (но >>> возвращает bigint, не number), &, \|, ^, ~, <, <=, >, >=, ===, !==, ==, != (но 1n == 1true, 1n === 1false).

Методы

МетодОписание
BigInt.asIntN(bits, bigint)Обрезает до bits бит со знаком
BigInt.asUintN(bits, bigint)Обрезает до bits бит без знака
bigint.toString(radix?)Строка в указанной системе счисления (2–36)

🔹 Boolean, Symbol, Error

Boolean

  • Boolean(x) — приведение к логическому (false для 0, "", null, undefined, NaN, false)
  • Не имеет полезных методов экземпляра.

Symbol

МетодОписание
Symbol(description?)Уникальный символ; description только для toString()
Symbol.for(key)Глобальный реестр символов — возвращает один и тот же символ по key
Symbol.keyFor(sym)Возвращает key из глобального реестра или undefined
Symbol.iteratorИмя метода итератора (obj[Symbol.iterator])
Symbol.toStringTagИмя для Object.prototype.toString.call(obj)"[object Tag]"
Symbol.hasInstanceКастомизация instanceof
Symbol.isConcatSpreadableУправляет поведением Array.prototype.concat
Symbol.speciesКастомизация конструктора для производных (map, slice и др.)
Symbol.match, Symbol.replace, Symbol.search, Symbol.splitКастомизация поведения String.prototype.* для объектов

Error и подклассы

КонструкторПрименение
Error(message?)Общая ошибка
EvalErrorОшибки eval() — устарело
RangeErrorВыход за пределы (например, Array(-1))
ReferenceErrorОбращение к несуществующей переменной в strict mode
SyntaxErrorОшибки разбора кода
TypeErrorНесоответствие типов (например, null.property)
URIErrorОшибки encodeURI, decodeURI
AggregateError(errors, message?) (ES2021)Группа ошибок (например, Promise.any при всех отклонениях)

Свойства экземпляра:

  • name: имя конструктора ('TypeError')
  • message: сообщение
  • stack: стек-трейс (не стандартизирован, но есть везде)

📚 Коллекции, итерабельность, регулярные выражения, дата и время


🔹 Map

Хранит пары ключ–значение, где ключ может быть любого типа (включая объекты и символы). Порядок вставки сохраняется.

Конструктор

new Map();                     // пустая коллекция
new Map(iterable); // iterable → [[key1, val1], [key2, val2], …]
new Map([ ['a', 1], [obj, 2] ]);

⚠️ Если iterable не предоставляет пары — TypeError.
⚠️ new Map({ a: 1 }) не работает — объект не итерируем по парам.

Методы экземпляра

МетодАргументыВозвращаетПоведение
set(key, value)ключ, значениеthisДобавляет или обновляет запись
get(key)ключзначение | undefinedВозвращает значение по ключу
has(key)ключbooleanЕсть ли ключ в карте
delete(key)ключbooleanУдаляет запись; true, если была
clear()undefinedУдаляет все записи
sizenumberКоличество записей (геттер)
keys()итератор ключейСохраняет порядок вставки
values()итератор значений
entries()итератор [key, value]То же, что [Symbol.iterator]()
forEach(callback, thisArg?)(value, key, map) => voidundefinedПеребор в порядке вставки

Сравнение ключей

— использует SameValueZero алгоритм:

  • 0 === -0true
  • NaN === NaNtrue
  • Объекты сравниваются по ссылке
  • +0 и -0 считаются одинаковыми

✅ Пример:

const m = new Map();
m.set(NaN, 'nan');
m.get(NaN); // 'nan'
m.set(0, 'zero');
m.set(-0, 'minus zero');
m.get(0); // 'minus zero' — перезаписано

Преимущества перед объектом

  • Ключи любого типа
  • Нет конфликта с наследованием (hasOwnProperty не нужен)
  • Размер известен мгновенно
  • Нет проблем с перечислением и __proto__
  • Гарантированный порядок

🔹 Set

Хранит уникальные значения любого типа. Порядок вставки сохраняется.

Конструктор

new Set();              // пусто
new Set(iterable); // дедупликация по SameValueZero

Методы экземпляра

МетодАргументыВозвращаетПоведение
add(value)значениеthisДобавляет, если ещё нет
has(value)значениеbooleanПрисутствует ли значение
delete(value)значениеbooleanУдаляет; true, если было
clear()undefinedОчищает
sizenumberКоличество элементов
values()итератор значенийТо же, что keys() и [Symbol.iterator]()
entries()итератор [value, value]Для совместимости с Map
forEach(callback, thisArg?)(value, value, set) => voidundefined

✅ Пример дедупликации:

const unique = [...new Set([1, 2, 2, 3, NaN, NaN])];
// [1, 2, 3, NaN]

🔹 WeakMap

Хранит пары ключ–значение, где ключи должны быть объектами, а значения — любыми.
Ключи хранятся слабо — если на объект нет других ссылок, он может быть удалён GC.

Ограничения

  • Нет size, clear(), keys(), values(), entries(), forEach()
  • Нельзя итерировать
  • Нет не-объектных ключей (new WeakMap().set('str', 1)TypeError)

Методы

МетодАргументыВозвращает
set(key, value)объект, значениеthis
get(key)объектзначение | undefined
has(key)объектboolean
delete(key)объектboolean

Применение

  • Привязка данных к DOM-узлам без утечек памяти
  • Кэширование, привязанное к жизненному циклу объекта
  • Метаданные, не нарушающие инкапсуляцию

✅ Пример:

const privateData = new WeakMap();
class Counter {
constructor() {
privateData.set(this, { count: 0 });
}
increment() {
const data = privateData.get(this);
data.count++;
}
}

🔹 WeakSet

Хранит уникальные объекты, слабо. Аналогично WeakMap, но только ключи, без значений.

Методы

МетодАргументыВозвращает
add(value)объектthis
has(value)объектboolean
delete(value)объектboolean

Применение

  • Отслеживание «посещённых» объектов
  • Маркировка объектов без изменения их структуры (if (seen.has(obj)) …)

🔹 Итерабельность и протоколы

Итерация: [Symbol.iterator]

Объект итерируем, если у него есть метод obj[Symbol.iterator], возвращающий итератор.

Итератор — объект с методом .next(), возвращающим { value: any, done: boolean }.

✅ Встроенные итерируемые объекты:
Array, String, Map, Set, TypedArray, arguments, NodeList, генераторы.

Асинхронная итерация: [Symbol.asyncIterator]

Аналогично, но .next() возвращает Promise<{ value, done }>.
Поддерживается в for await…of.

✅ Пример:

const asyncIterable = {
[Symbol.asyncIterator]() {
let i = 0;
return {
next() {
return Promise.resolve(i < 3 ? { value: i++, done: false } : { done: true });
}
};
}
};

(async () => {
for await (const x of asyncIterable) console.log(x); // 0, 1, 2
})();

for…of vs for…in

КонструкцияИтерируетПример
for (x of iterable)значения итератораfor (const ch of "ab")'a', 'b'
for (key in obj)перечислимые строковые ключи (собственные + унаследованные)for (const k in {a:1})'a'

⚠️ for…in не гарантирует порядок (хотя в современных движках — порядок вставки для строк).
⚠️ for…in может вернуть методы из прототипа — используйте Object.hasOwn(obj, key).


🔹 Генераторы (function*)

Генератор — функция, возвращающая итератор и позволяющая приостанавливать выполнение с помощью yield.

Синтаксис

function* gen() {
yield 1;
yield 2;
return 3; // значение в { value: 3, done: true }
}

const g = gen();
g.next(); // { value: 1, done: false }
g.next(); // { value: 2, done: false }
g.next(); // { value: 3, done: true }
g.next(); // { value: undefined, done: true }

yield и yield*

  • yield expr — приостанавливает и возвращает expr
  • yield* iterable — делегирует итерацию другому итерируемому (включая другие генераторы)

✅ Пример делегирования:

function* range(start, end) {
for (let i = start; i < end; i++) yield i;
}
function* combined() {
yield* range(1, 3);
yield* range(5, 7);
}
[...combined()]; // [1, 2, 5, 6]

Управление генератором

МетодАргументЭффект
next(value?)значениеВозобновляет выполнение: yield expr возвращает value
throw(error)ошибкаВыбрасывает ошибку в точке yield внутри генератора
return(value?)значениеПринудительно завершает генератор: возвращает { value, done: true }

✅ Пример двусторонней связи:

function* echo() {
const x = yield 'start';
yield x.toUpperCase();
}

const g = echo();
g.next(); // { value: 'start', done: false }
g.next('hello'); // { value: 'HELLO', done: false }

Асинхронные генераторы (async function*)

  • Возвращают асинхронный итератор
  • Могут использовать await и yield
  • yield приостанавливает до разрешения await, но yield сам по себе синхронен

✅ Пример:

async function* fetchPages(url) {
let page = 1;
while (true) {
const res = await fetch(`${url}?page=${page}`);
const data = await res.json();
if (data.items.length === 0) return;
yield data.items;
page++;
}
}

(async () => {
for await (const items of fetchPages('/api/data')) {
console.log(items);
}
})();

🔹 RegExp

Синтаксис

/regex/flags
new RegExp('regex', 'flags')

Флаги (ES2024)

ФлагОписание
gГлобальный поиск (все совпадения)
iИгнорировать регистр
mМногострочный режим (^ и $ — начало/конец строки, а не всего текста)
sDotAll — . совпадает с \n (ES2018)
uUnicode — корректная обработка суррогатных пар и классов (например, \p{Letter}) (ES2015)
ySticky — поиск только с текущей позиции (lastIndex) (ES2015)
dIndices — включает indices в результат exec() (ES2022)

⚠️ /./u.test('🙂')true, /./.test('🙂')true, но /.+/ даст два совпадения без u.

Группы

СинтаксисНазваниеДоступ
(…)Захватывающая группаresult[1], result.groups (если именованная)
(?:…)НезахватывающаяНет в результатах
(?<name>…)Именованная захватывающаяresult.groups.name
(?=…)Позитивный просмотр вперёдНе захватывается
(?!…)Негативный просмотр вперёд
(?<=…)Позитивный просмотр назад (ES2018)
(?<!…)Негативный просмотр назад (ES2018)

Методы

МетодНа что вызываетсяАргументыВозвращаетОсобенности
test(str)RegExpстрокаbooleanОбновляет lastIndex, если g/y
exec(str)RegExpстрокаRegExpExecArray | nullПри g/y — последовательные вызовы дают следующие совпадения; содержит index, input, groups (если есть именованные), indices (если d)
str.match(regexp)строкарегэкспRegExpMatchArray | nullБез g — как exec; с g — массив строк без доп. данных
str.matchAll(regexp)строкарегэксп (должен иметь g)итератор RegExpExecArrayВсе совпадения с полными данными (ES2020)
str.search(regexp)строкарегэкспnumber | -1Индекс первого совпадения
str.replace(search, replace)строкарегэксп/строка, строка/функцияstringПри search = строка — замена только первого вхождения; при регэкспе без g — тоже первое
str.replaceAll(search, replace)строкастрока, строка ИЛИ регэксп с g, строка/функцияstringВсе вхождения (ES2021)

✅ Пример с именованными группами:

const re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
const m = re.exec('2025-11-22');
m.groups; // { year: '2025', month: '11', day: '22' }

✅ Замена с функцией:

'a1b2'.replace(/\d/g, d => (Number(d) * 2).toString());
// 'a2b4'

🔹 Date

Основан на количестве миллисекунд с 1970-01-01T00:00:00.000Z (Unix timestamp × 1000).
Внутренне хранится как UTC, но методы интерпретируют в локальной временной зоне, если не указано иное.

Конструктор

ВызовРезультат
new Date()Текущее время
new Date(value)По timestamp (мс)
new Date(dateString)По строке (ISO 8601 предпочтительно)
new Date(year, month, date?, hours?, minutes?, seconds?, ms?)Локальное время; month от 0 (янв) до 11

⚠️ new Date(2025, 11, 22) → 22 декабря 2025, не ноября.

Методы экземпляра (геттеры/сеттеры)

ПрефиксЛокальное времяUTC
`(getset)FullYear`год (4 цифры)
`(getset)Month`месяц (0–11)
`(getset)Date`день месяца (1–31)
`(getset)Hours`часы (0–23)
`(getset)Minutes, Seconds, Milliseconds`
getTime() / setTime(ms)timestamp в мс
getTimezoneOffset()смещение локальной зоны от UTC в минутах (Москва: -180 зимой, -120 летом)

Форматирование

МетодОписание
toString()Человекочитаемая строка в локальном времени и зоне
toDateString(), toTimeString()Только дата / только время
toISOString()Строка в формате ISO 8601 (UTC): YYYY-MM-DDTHH:mm:ss.sssZ
toUTCString()Устаревший формат (Fri, 22 Nov 2025 12:00:00 GMT)
toLocaleDateString(locales?, options?)Локализованная дата
toLocaleTimeString(locales?, options?)Локализованное время
toLocaleString(locales?, options?)Дата + время
toJSON()То же, что toISOString() — используется JSON.stringify

✅ Пример:

new Date().toISOString(); // '2025-11-22T12:34:56.789Z'

Статические методы

МетодОписание
Date.now()Текущий timestamp в мс (рекомендуется вместо new Date().getTime())
Date.parse(string)Парсинг строки → timestamp (не все форматы)
Date.UTC(year, month, …)Возвращает timestamp для UTC-времени (аналогично конструктору, но интерпретирует как UTC)

⚠️ Date.parse('2025-11-22') → UTC-полдень (12:00:00Z), не полночь.
✅ Для полночи: Date.parse('2025-11-22T00:00:00Z').


📚 Асинхронность, модули, DOM API, глобальные функции, strict mode, Web APIs


🔹 Асинхронность: Promise, async/await, очередь задач

Promise

Объект, представляющий окончательный результат асинхронной операции (выполнен или отклонён).

Конструктор
new Promise((resolve, reject) => {
// Асинхронная логика
if (успех) resolve(value);
else reject(reason); // reason — обычно Error
});

⚠️ Executor вызывается синхронно при создании Promise.

Статические методы
МетодАргументыВозвращаетПоведение
Promise.resolve(value)значениеPromiseЕсли valuePromise, возвращает его; если thenable — оборачивает; иначе — fulfilled с value
Promise.reject(reason)причинаPromiserejected с reason
Promise.all(iterable)итерируемое Promise-овPromise<value[]>Выполняется, когда все fulfilled; отклоняется при первом reject
Promise.allSettled(iterable)итерируемоеPromise<Array<{ status: 'fulfilled'|'rejected', value|reason }>>Ждёт всех, возвращает статус каждого (ES2020)
Promise.race(iterable)итерируемоеPromiseРезультат первого settled (fulfilled или rejected)
Promise.any(iterable)итерируемоеPromiseВыполняется при первом fulfilled; отклоняется, только если все rejected → AggregateError (ES2021)
Promise.withResolvers(){ promise: Promise, resolve: fn, reject: fn }Упрощает создание Promise вне executor’а (ES2024, Stage 4)

✅ Пример withResolvers (удобно для кэширования, отмены):

function createDeferred() {
const { promise, resolve, reject } = Promise.withResolvers();
return { promise, resolve, reject };
}
Методы экземпляра
МетодАргументыВозвращаетОписание
then(onFulfilled?, onRejected?)функцииPromiseЦепочка обработки; onRejected ловит ошибки только из предыдущего Promise
catch(onRejected)функцияPromiseЭквивалент then(null, onRejected)
finally(onFinally)функцияPromiseВызывается в любом случае (fulfilled/rejected), не меняет результат (ES2018)

⚠️ return внутри then оборачивается в Promise.resolve(...).
⚠️ Исключение внутри then/catch превращается в rejected Promise.


async / await

Синтаксический сахар над Promise.

Правила
  • async function всегда возвращает Promise.
  • await можно использовать только внутри async function (или на верхнем уровне модуля — top-level await, ES2022).
  • await expr приостанавливает выполнение до завершения expr (если expr не Promise — оборачивается в Promise.resolve(expr)).
Обработка ошибок
// Вариант 1: try/catch
async function f() {
try {
const res = await fetch('/api');
const data = await res.json();
return data;
} catch (e) {
console.error('Fetch failed', e);
throw e;
}
}

// Вариант 2: .catch на уровне вызова
f().catch(e => {});

Не пишите await в цепочке без необходимости:

// Плохо — последовательно:
const a = await p1;
const b = await p2;

// Хорошо — параллельно:
const [a, b] = await Promise.all([p1, p2]);

Очередь задач

ТипПримерыКогда выполняется
Микрозадачи (microtask)Promise.then/catch/finally, queueMicrotask, MutationObserver, process.nextTick (в Node)После текущего синхронного блока, до следующего макротаска и рендеринга
Макротаски (task)setTimeout, setInterval, setImmediate (Node), requestAnimationFrame, I/O, UI-событияВ порядке поступления, после микрозадач и рендеринга

queueMicrotask(callback) — стандартный способ добавить микрозадачу (ES2020).

📌 Порядок:

Синхронный код
→ микрозадачи (все, в цикле, пока очередь не пуста)
→ рендеринг (если нужно)
→ макротаск (один)
→ микрозадачи (опять все)
→ рендеринг → макротаск → …

🔹 ES Modules (ESM)

Стандартизированная система модулей, основанная на import/export.

Экспорт

СинтаксисОписание
export const x = 1;Именованный экспорт
export { x, y as z };Экспорт существующих переменных (можно переименовать)
export function f() {}Именованный экспорт функции/класса
export default expr;Экспорт по умолчанию (один на модуль)
export * from './other.js';Реэкспорт всех именованных
export { x } from './other.js';Реэкспорт конкретных

⚠️ export default function() {} — анонимная функция по умолчанию.
⚠️ export default 42; — допустимо, но редко используется.

Импорт

СинтаксисОписание
import { x, y as z } from './mod.js';Именованный импорт
import defaultExport from './mod.js';Импорт по умолчанию
import * as mod from './mod.js';Пространство имён (объект со всеми именованными)
import def, { x } from './mod.js';Смешанный: дефолт + именованные
import './side-effect.js';Импорт только для side effect’ов

Динамический импорт

const module = await import('./mod.js');
module.default;
module.x;

— возвращает Promise, разрешающийся в объект модуля.
— работает в любом контексте (даже не в async).
— полезен для ленивой загрузки, условного импорта.

Особенности

  • Строгий режим включён всегда
  • Асинхронная загрузка (в браузере — сетевые запросы; в средах без I/O — мгновенно)
  • Hoisting: импорты поднимаются и выполняются до тела модуля
  • Иммутабельность импортов: import { x } — live binding (если x изменится в модуле, изменится и здесь)

✅ Пример live binding:

// counter.js
export let count = 0;
export function inc() { count++; }

// main.js
import { count, inc } from './counter.js';
console.log(count); // 0
inc();
console.log(count); // 1 — обновилось

🔹 DOM API (основные интерфейсы и методы)

Все приведённые ниже интерфейсы встроены в глобальный объект в браузере.

Window (глобальный объект в браузере)

Свойство / МетодОписание
documentКорневой объект DOM
location, history, navigator, screenAPI окружения
addEventListener(type, listener, options?)Регистрация обработчика события
setTimeout(handler, timeout, ...args)Отложенное выполнение (макротаск)
setInterval(handler, interval, ...args)Повторяющееся выполнение
clearTimeout(id), clearInterval(id)Отмена
requestAnimationFrame(callback)Вызов перед следующей перерисовкой (макротаск)
cancelAnimationFrame(id)Отмена
fetch(url, options?)HTTP-запросы (возвращает Promise<Response>)
localStorage, sessionStorageХранилища (см. ниже)
alert, confirm, promptДиалоги (избегайте в продакшене)

Document

МетодАргументыВозвращаетОписание
getElementById(id)строкаElement | nullБыстрый поиск по id
querySelector(selector)CSS-селекторElement | nullПервый элемент
querySelectorAll(selector)CSS-селекторNodeList (статичный)Все элементы
createElement(tagName, options?)имя тега, { is: customElementName }ElementСоздание элемента
createTextNode(data)строкаTextТекстовый узел
createDocumentFragment()DocumentFragmentЛёгкий контейнер для групповой вставки
importNode(node, deep)узел, глубинаклон узлаБез привязки к текущему документу
adoptNode(node)узелузелПеремещает узел из другого документа
addEventListener(...)Обработка событий на всём документе

Element

Наследует от Node.

Свойство / МетодОписание
id, className, classListid, строка классов, объект DOMTokenList с методами add, remove, toggle, contains
datasetОбъект для data-* атрибутов (data-user-iddataset.userId)
styleОбъект CSSStyleDeclaration для inline-стилей (el.style.color = 'red')
getAttribute(name), setAttribute(name, value), removeAttribute(name)Работа с атрибутами
hasAttribute(name)Проверка наличия атрибута
innerHTML, outerHTMLЧтение/запись HTML-содержимого (опасно при ненадёжных данных — XSS)
textContentТекстовое содержимое (без тегов, безопасно для вставки)
appendChild(node), prepend(node), append(...nodesOrStrings), before(...), after(...), replaceWith(...)Вставка/замена (современные методы — ES2017+)
remove()Удаление себя из родителя
closest(selector)Ближайший предок, соответствующий селектору (включая себя)
matches(selector)Соответствует ли элемент селектору
querySelector, querySelectorAllПоиск внутри элемента

Node

Свойство / МетодОписание
parentNode, parentElementРодитель (parentElement — только Element, иначе null)
childNodes, childrenNodeList всех дочерних узлов / только элементов
firstChild, lastChild, firstElementChild, lastElementChildПервый/последний узел / элемент
nextSibling, previousSibling, nextElementSibling, previousElementSiblingСоседи
nodeTypeТип узла: 1 (Element), 3 (Text), 8 (Comment), 9 (Document), 11 (DocumentFragment)
nodeNameИмя: 'DIV', '#text', '#comment', '#document'
cloneNode(deep)Клонирование узла

EventTarget

МетодОписание
addEventListener(type, listener, options?)options: { capture: false, once: false, passive: false, signal: AbortSignal }
removeEventListener(type, listener, options?)Должен быть тот же listener и options (кроме signal)
dispatchEvent(event)Синтетическое событие

✅ Используйте AbortController для массовой отмены:

const ac = new AbortController();
el.addEventListener('click', handler, { signal: ac.signal });
ac.abort(); // отменяет все слушатели с этим сигналом

Event

СвойствоОписание
type'click', 'keydown', и т.д.
targetЭлемент, на котором произошло событие (цель)
currentTargetЭлемент, на котором зарегистрирован обработчик
bubblesВсплывает ли событие
cancelableМожно ли отменить (preventDefault)
defaultPreventedБыл ли вызван preventDefault
stopPropagation()Останавливает всплытие
stopImmediatePropagation()Останавливает всплытие и другие обработчики на этом элементе
preventDefault()Отменяет действие по умолчанию (например, отправку формы)

🔹 Глобальные функции (не методы)

ФункцияОписаниеОсобенности
eval(code)Выполняет строку как код❗ Избегайте — нарушает scope, безопасность, оптимизации
isFinite(value)true, если число и не ±Infinity, не NaNПриводит аргумент к числу
isNaN(value)true, если Number(value)NaNПриводит аргумент к числу
parseFloat(string)Парсит число до первого нецифрового символаПоддерживает Infinity, +/-, .; игнорирует пробелы в начале
parseInt(string, radix?)Парсит целое число в системе счисленияradix по умолчанию: 10, но если строка начинается с 0x → 16; 0 → 8 (legacy, избегайте — всегда указывайте radix)
encodeURI(uri)Кодирует URI, кроме зарезервированных (:, /, ?, #, [, ], @, !, $, &, ', (, ), *, +, ,, ;, =)Для всего URI
decodeURI(encodedURI)Декодирует encodeURI
encodeURIComponent(str)Кодирует компонент URI (все спецсимволы)Для параметров, фрагментов и т.п.
decodeURIComponent(encodedStr)Декодирует encodeURIComponent

✅ Пример:

encodeURIComponent('кот+мышка?'); // '%D0%BA%D0%BE%D1%82%2B%D0%BC%D1%8B%D1%88%D0%BA%D0%B0%3F'
encodeURI('https://example.com/путь?п=1'); // 'https://example.com/%D0%BF%D1%83%D1%82%D1%8C?%D0%BF=1'

🔹 Strict mode ("use strict")

Режим с более строгими правилами и запретами.

Активация

  • В начале скрипта: "use strict";
  • В начале функции: внутри function() { "use strict"; … }

Изменения

ПоведениеВ non-strictВ strict
Присваивание необъявленной переменнойСоздаёт глобальное свойствоReferenceError
Удаление переменных/функцийtrueSyntaxError
Дублирование параметровДопустимоSyntaxError
this в несвязанной функцииglobalThis (в браузере — window)undefined
withДопустимSyntaxError
argumentsСвязаны с параметрами (изменение arguments[0] меняет a)Не связаны (копия при входе)
eval создаёт переменные в caller scopeДаНет — локальная область
delete неconfigurable свойстваfalseTypeError
Восьмеричные литералы (010)8SyntaxError (используйте 0o10)

✅ Модули и классы всегда в strict mode.


🔹 Web APIs (вне DOM, но в браузере)

fetch

fetch(url, {
method: 'GET', // 'POST', 'PUT', …
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data), // для POST/PUT
mode: 'cors', // 'same-origin', 'no-cors'
credentials: 'same-origin', // 'include', 'omit'
cache: 'default', // 'no-store', 'reload', 'force-cache', …
redirect: 'follow', // 'manual', 'error'
signal: ac.signal, // AbortSignal для отмены
integrity: 'sha256-…' // Subresource Integrity
})
.then(res => {
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json(); // .text(), .blob(), .arrayBuffer()
});

⚠️ fetch не отклоняется при HTTP-ошибках (4xx/5xx) — только при сетевых сбоях.

URL и URLSearchParams

const url = new URL('https://example.com/path?x=1&y=2#frag');
url.protocol; // 'https:'
url.hostname; // 'example.com'
url.pathname; // '/path'
url.search; // '?x=1&y=2'
url.hash; // '#frag'

const params = new URLSearchParams(url.search);
params.get('x'); // '1'
params.set('z', '3');
params.toString(); // 'x=1&y=2&z=3'
url.search = params.toString();

localStorage / sessionStorage

МетодОписание
setItem(key, value)Сохраняет строку (value приводится к строке)
getItem(key)Возвращает строку или null
removeItem(key)Удаляет
clear()Очищает всё
key(index)Ключ по индексу
lengthКоличество записей

⚠️ Хранит только строки. Для объектов — JSON.stringify/JSON.parse.
⚠️ localStorage — постоянное (до очистки), sessionStorage — на сессию (вкладку).

AbortController / AbortSignal

const ac = new AbortController();
fetch('/long', { signal: ac.signal })
.catch(e => {
if (e.name === 'AbortError') console.log('Отменено');
});

// Где-то позже:
ac.abort(); // вызывает AbortError в fetch

— стандартный механизм отмены асинхронных операций.


📚 Продвинутые и системные механизмы JavaScript


🔹 Proxy

Объект-обёртка, позволяющая перехватывать и кастомизировать основные операции над другим объектом (target).

Конструктор

const proxy = new Proxy(target, handler);
  • target — любой объект (включая функции, массивы, даже Proxy);
  • handler — объект с ловушками (traps) — методами, переопределяющими поведение.

Ловушки (traps) и их соответствие в Reflect

ЛовушкаВызывается приАргументыАналог в ReflectЗначение по умолчанию
get(target, prop, receiver)proxy.prop, proxy['prop']target, ключ (string/symbol), receiver (обычно proxy)Reflect.get(target, prop, receiver)target[prop]
set(target, prop, value, receiver)proxy.prop = valtarget, ключ, значение, receiverReflect.set(target, prop, value, receiver)target[prop] = value
has(target, prop)prop in proxytarget, ключReflect.has(target, prop)prop in target
deleteProperty(target, prop)delete proxy.proptarget, ключReflect.deleteProperty(target, prop)delete target[prop]
ownKeys(target)Object.keys/values/entries(proxy), for…in, getOwnPropertyNames/SymbolstargetReflect.ownKeys(target)Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target))
getOwnPropertyDescriptor(target, prop)Object.getOwnPropertyDescriptor(proxy, prop)target, ключReflect.getOwnPropertyDescriptor(target, prop)Object.getOwnPropertyDescriptor(target, prop)
defineProperty(target, prop, descriptor)Object.defineProperty(proxy, prop, desc)target, ключ, дескрипторReflect.defineProperty(target, prop, descriptor)Object.defineProperty(target, prop, descriptor)
preventExtensions(target)Object.preventExtensions(proxy)targetReflect.preventExtensions(target)Object.preventExtensions(target)
getPrototypeOf(target)Object.getPrototypeOf(proxy), proxy.__proto__targetReflect.getPrototypeOf(target)Object.getPrototypeOf(target)
setPrototypeOf(target, proto)Object.setPrototypeOf(proxy, proto)target, прототипReflect.setPrototypeOf(target, proto)Object.setPrototypeOf(target, proto)
isExtensible(target)Object.isExtensible(proxy)targetReflect.isExtensible(target)Object.isExtensible(target)
apply(target, thisArg, args)proxy(...args) — если target функцияtarget, this, массив аргументовReflect.apply(target, thisArg, args)target.apply(thisArg, args)
construct(target, args, newTarget)new proxy(...args)target, аргументы, newTarget (обычно proxy)Reflect.construct(target, args, newTarget)new target(...args)

✅ Пример: валидация присваивания

const validator = {
set(target, prop, value) {
if (prop === 'age' && (typeof value !== 'number' || value < 0)) {
throw new TypeError('age must be non-negative number');
}
return Reflect.set(target, prop, value);
}
};
const person = new Proxy({ age: 0 }, validator);
person.age = 25; // OK
person.age = -1; // TypeError

⚠️ Proxy не может сделать объект «более открытым», чем target. Например, если свойство non-configurable в target, его нельзя сделать configurable в Proxy.


🔹 Reflect

Встроенный объект, предоставляющий методы для перехватываемых операций, аналогичные ловушкам Proxy, но в виде функций.

Зачем нужен?

  • Единообразный API для метапрограммирования
  • Безопасные операции (не бросают исключения в случае неудачи — возвращают false)
  • Используется в Proxy по умолчанию
  • Позволяет вызывать поведение по умолчанию в обработчиках Proxy

Методы (все 13 — по одной на ловушку)

МетодАналог в кодеВозвращает
Reflect.get(target, prop, receiver?)target[prop]значение
Reflect.set(target, prop, value, receiver?)target[prop] = valueboolean (успех)
Reflect.has(target, prop)prop in targetboolean
Reflect.deleteProperty(target, prop)delete target[prop]boolean
Reflect.ownKeys(target)Object.getOwnPropertyNames + getOwnPropertySymbolsstring[] | symbol[]
Reflect.getOwnPropertyDescriptor(target, prop)PropertyDescriptor | undefined
Reflect.defineProperty(target, prop, descriptor)Object.definePropertyboolean
Reflect.preventExtensions(target)Object.preventExtensionsboolean
Reflect.getPrototypeOf(target)Object.getPrototypeOfобъект | null
Reflect.setPrototypeOf(target, proto)Object.setPrototypeOfboolean
Reflect.isExtensible(target)Object.isExtensibleboolean
Reflect.apply(target, thisArg, args)Function.prototype.applyрезультат вызова
Reflect.construct(target, args, newTarget?)new target(...args)экземпляр

✅ Преимущество Reflect.apply:

// Безопасный вызов даже если fn.apply перезаписан:
Reflect.apply(Math.max, null, [1, 2, 3]); // 3

🔹 Symbol — well-known символы и их применение

Well-known символы — встроенные символы, определяющие поведение объектов в языке.

СимволПрименениеОписание
Symbol.iteratorobj[Symbol.iterator]Должен возвращать итератор; делает объект итерируемым
Symbol.asyncIteratorobj[Symbol.asyncIterator]Для асинхронной итерации (for await…of)
Symbol.toStringTagObject.prototype.toString.call(obj)Возвращаемое имя: '[object ' + tag + ']'
Symbol.hasInstanceinstanceofКастомизация проверки: obj[Symbol.hasInstance](value)
Symbol.isConcatSpreadableArray.prototype.concatЕсли true — элемент раскрывается как массив
Symbol.speciesArray.prototype.map, slice, filter и др.Конструктор для производных (new this.constructor[Symbol.species](...))
Symbol.matchString.prototype.matchЕсли Symbol.match в объекте — вызывается вместо RegExp.prototype[Symbol.match]
Symbol.replace, Symbol.search, Symbol.splitString.prototype.replace/search/splitАналогично match
Symbol.toPrimitiveПри приведении к примитиву (hint: 'number', 'string', 'default')obj[Symbol.toPrimitive](hint) → примитив
Symbol.unscopableswith (но with запрещён в strict mode)Свойства, исключаемые из scope в with

✅ Пример Symbol.toStringTag:

class Vector {
[Symbol.toStringTag] = 'Vector';
}
Object.prototype.toString.call(new Vector()); // '[object Vector]'

✅ Пример Symbol.isConcatSpreadable:

const arr = [1, 2];
arr[Symbol.isConcatSpreadable] = false;
[0].concat(arr); // [0, [1, 2]] — не раскрылось

🔹 Intl — интернационализация

Пакет API для локализации форматирования.

Intl.DateTimeFormat

new Intl.DateTimeFormat(locales?, options?).format(date);

Важные options:

  • dateStyle: 'full', 'long', 'medium', 'short'
  • timeStyle: аналогично
  • year, month, day, hour, minute, second: 'numeric', '2-digit', 'long', 'short', 'narrow'
  • timeZone: 'Europe/Moscow', 'UTC' и др.
  • hour12: true/false — 12-часовой формат

✅ Пример:

new Intl.DateTimeFormat('ru-RU', {
day: 'numeric',
month: 'long',
year: 'numeric',
timeZone: 'UTC'
}).format(new Date('2025-11-22T00:00:00Z'));
// '22 ноября 2025 г.'

Intl.NumberFormat

new Intl.NumberFormat(locales?, options?).format(number);

Важные options:

  • style: 'decimal' (по умолчанию), 'currency', 'percent', 'unit'
  • currency: 'RUB', 'USD' и др. (только при style: 'currency')
  • currencyDisplay: 'symbol', 'code', 'name'
  • useGrouping: true/false — разделители тысяч
  • minimumIntegerDigits, minimumFractionDigits, maximumFractionDigits
  • unit: 'meter', 'second', 'byte' и др. (при style: 'unit')

✅ Пример:

new Intl.NumberFormat('ru-RU', {
style: 'currency',
currency: 'RUB',
currencyDisplay: 'symbol'
}).format(1234.5);
// '1 234,50 ₽'

Intl.Collator

Сравнение строк с учётом локали.

const collator = new Intl.Collator('ru', { sensitivity: 'base' });
collator.compare('Ёж', 'Еж'); // 0 — считаются одинаковыми
['Ё', 'Е', 'А'].sort(collator.compare); // ['А', 'Е', 'Ё']

Остальные

КонструкторНазначение
Intl.ListFormatФорматирование списков: 'А, Б и В' (ES2021)
Intl.RelativeTimeFormatОтносительное время: 'через 2 дня', '3 часа назад' (ES2021)
Intl.PluralRulesОпределение формы множественного числа по числу (для локализованных сообщений)
Intl.SegmenterСегментация текста на графемы, слова, предложения (ES2022)

✅ Пример ListFormat:

new Intl.ListFormat('ru', { style: 'long', type: 'conjunction' })
.format(['яблоки', 'груши', 'апельсины']);
// 'яблоки, груши и апельсины'

🔹 structuredClone(value, options?)

Глубокое клонирование со встроенными типами, без использования JSON.stringify.

Поддерживаемые типы

  • Все примитивы
  • Object, Array, Map, Set, Date, RegExp, Error, Boolean, String, Number, BigInt
  • TypedArray, DataView, ArrayBuffer (по умолчанию — копия буфера; с transfer — перемещение)
  • Blob, File, CryptoKey (в браузере)
  • Циклические ссылки
  • SharedArrayBufferтолько если structuredClone вызван в том же агенте (thread)

Опции

structuredClone(value, {
transfer: [arrayBuffer1, arrayBuffer2], // передаёт владение (буферы становятся detached)
serializable: true // (опционально, редко) — только сериализуемые типы
});

✅ Пример:

const original = { a: 1, b: new Map([[1, 2]]) };
const copy = structuredClone(original);
copy.b.set(3, 4);
console.log(original.b.has(3)); // false — независимо

⚠️ Не клонирует:

  • Функции
  • Symbol (кроме well-known)
  • WeakMap, WeakSet
  • DOM-узлы
  • Объекты с Proxy

🔹 globalThis

Единая ссылка на глобальный объект во всех средах:

СредаДо globalThisglobalThis
Браузерwindow, self, frameswindow
Web Workerselfself
Node.js (с v12)globalglobal

✅ Используйте globalThis, если пишете универсальный код.


🔹 Редкие конструкции и операторы

КонструкцияОписаниеСтатус
with (obj) stmtРасширяет scope на свойства objЗапрещён в strict mode — не используйте
label: stmtМетка для break/continueДопустим, но редко нужен
debugger;Точка остановаБезопасен — игнорируется без отладчика
void exprВыполняет expr, возвращает undefinedПолезно в href="javascript:void(0)" или для гарантии undefined
, (запятая)Последовательное вычисление, возвращает последнееРедко — например, в for (i = 0, j = 10; i < j; i++, j--)

✅ Пример void:

const undef = void 0; // надёжнее, чем `undefined`, если переменная переопределена

🔹 Системные типы и API (низкоуровневые)

SharedArrayBuffer

Буфер памяти, доступный из нескольких потоков (Web Workers).

⚠️ Требует:

  • HTTPS
  • Отсутствие Cross-Origin-Opener-Policy: same-origin и Cross-Origin-Embedder-Policy: require-corp (в современных браузерах — только при явной настройке COOP/COEP)
    — иначе SharedArrayBuffer не определён.

Atomics

Атомарные операции над Int32Array/BigInt64Array, созданными на SharedArrayBuffer.

МетодОписание
Atomics.load(typedArray, index)Атомарное чтение
Atomics.store(typedArray, index, value)Атомарная запись
Atomics.add/sub/and/or/xor/exchange/compareExchangeОперации с возвратом старого значения
Atomics.wait(typedArray, index, value, timeout?)Блокировка потока (только в Workers)
Atomics.notify(typedArray, index, count?)Пробуждение ожидающих потоков

✅ Пример синхронизации:

// В основном потоке:
const sab = new SharedArrayBuffer(4);
const ia = new Int32Array(sab);
ia[0] = 0;
worker.postMessage({ sab });

// В Worker:
self.onmessage = e => {
const ia = new Int32Array(e.data.sab);
Atomics.wait(ia, 0, 0); // ждёт, пока ia[0] ≠ 0
console.log('Разрешено');
};

// Позже в основном потоке:
Atomics.store(ia, 0, 1);
Atomics.notify(ia, 0);

WebAssembly

Базовые API для работы с WASM (без деталей модулей).

Объект / МетодНазначение
WebAssembly.compile(bytes)Компиляция ArrayBuffer в WebAssembly.Module
WebAssembly.instantiate(module, importObject?)Создание экземпляра из модуля
WebAssembly.instantiateStreaming(response, importObject?)Прямая загрузка из fetch()
WebAssembly.validate(bytes)Проверка валидности байткода
WebAssembly.ModuleСкомпилированный модуль (можно кэшировать)
WebAssembly.InstanceВыполняемый экземпляр (имеет .exports)

✅ Минимальный пример:

// Простой WASM-модуль, возвращающий 42
const bytes = new Uint8Array([
0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0x60, 0x00, 0x01, 0x7f,
0x03, 0x02, 0x01, 0x00, 0x07, 0x08, 0x01, 0x04, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00,
0x0a, 0x05, 0x01, 0x03, 0x00, 0x41, 0x2a, 0x0b
]);

WebAssembly.instantiate(bytes).then(result => {
console.log(result.instance.exports.main()); // 42
});

🔹 Запрещённые, устаревшие и ненадёжные конструкции

КонструкцияПроблемаАльтернатива
__proto__Не стандартизировано как свойство (есть как accessor в аннексе B)Object.getPrototypeOf, Object.setPrototypeOf
Function.prototype.arguments, .callerУстаревшее, отключено в strict modeИспользуйте arguments внутри функции напрямую
escape / unescapeУстаревшие, не соответствуют URI-стандартамencodeURI, encodeURIComponent
document.allNon-standard, falsy, но typeof'undefined'Избегайте — используется в детекции IE
withЛомает оптимизации, непредсказуемый scopeНе используйте
new Array(len) для больших lenМожет выделить память неявноArray.from({ length: n }) или new Array(n).fill(0) при необходимости